# 导入VectorStoreIndex和Document类，用于向量存储和文档表示
from llama_index.core import VectorStoreIndex, Document,get_response_synthesizer

# 导入SubQuestionQueryEngine类，用于多步骤子问题查询
from llama_index.core.query_engine import SubQuestionQueryEngine
from llama_index.core.question_gen import LLMQuestionGenerator

# 导入QueryEngineTool类，用于将查询引擎封装为工具
from llama_index.core.tools import QueryEngineTool

# 定义一个包含示例文本的列表
sample_texts = [
    "LlamaIndex支持多种查询策略，包括简单查询和复杂查询。",
    "多步骤查询可以将复杂问题分解为多个子问题。",
    "SubQuestionQueryEngine能够自动分解复杂查询并整合结果。",
    "查询工具可以将不同的查询引擎组合成更强大的系统。",
]

# 将每个示例文本包装成Document对象，组成文档列表
documents = [Document(text=text) for text in sample_texts]
# 通过文档列表创建向量存储索引
index = VectorStoreIndex.from_documents(documents)

# 创建基础查询引擎，用于后续封装
base_query_engine = index.as_query_engine()

# 使用QueryEngineTool将基础查询引擎封装为工具，便于组合和调用
query_tool = QueryEngineTool.from_defaults(
    query_engine=base_query_engine, description="用于回答关于LlamaIndex的问题"
)

question_gen = LLMQuestionGenerator.from_defaults()
response_synthesize = get_response_synthesizer()
# 创建SubQuestionQueryEngine，支持将复杂查询自动分解为多个子问题并整合结果
# verbose=True表示输出详细的查询过程
sub_question_query_engine = SubQuestionQueryEngine(
    query_engine_tools=[query_tool],  question_gen=question_gen,response_synthesizer=response_synthesize,verbose=True
)

# 执行复杂查询，自动分解为子问题并整合答案
response = sub_question_query_engine.query(
    "LlamaIndex有哪些查询策略？它们各自有什么特点？"
)
# 打印复杂查询的最终结果
print(f"复杂查询结果: {response}")
